package com.smart.community.property.enums;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 计费方式费用类型枚举
 * 严格遵循《系统状态枚举权威标准声明.md》《智慧社区微服务架构总览.md》
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 1.0.0
 */
@Getter
@AllArgsConstructor
public enum BillingFeeTypeEnum {
    
    /**
     * 物业费
     */
    PROPERTY("property", "物业费"),
    
    /**
     * 卫生费
     */
    SANITATION("sanitation", "卫生费"),
    
    /**
     * 燃气费
     */
    GAS("gas", "燃气费"),
    
    /**
     * 水费
     */
    WATER("water", "水费"),
    
    /**
     * 电费
     */
    ELECTRICITY("electricity", "电费");

    /**
     * 枚举值
     */
    @JsonValue
    private final String code;
    
    /**
     * 枚举描述
     */
    private final String description;
    
    /**
     * 根据code获取枚举
     * 
     * @param code 枚举值
     * @return 对应的枚举，如果不存在则返回null
     */
    public static BillingFeeTypeEnum getByCode(String code) {
        if (code == null) {
            return null;
        }
        
        for (BillingFeeTypeEnum feeType : values()) {
            if (feeType.getCode().equals(code)) {
                return feeType;
            }
        }
        return null;
    }
    
    /**
     * Jackson反序列化方法
     * 严格遵循《系统状态枚举权威标准声明.md》规范
     * 
     * @param code 枚举值
     * @return 对应的枚举，如果不存在则返回null
     */
    @JsonCreator
    public static BillingFeeTypeEnum fromCode(String code) {
        return getByCode(code);
    }
    
    /**
     * 根据code获取描述
     * 
     * @param code 枚举值
     * @return 对应的描述，如果不存在则返回null
     */
    public static String getDescriptionByCode(String code) {
        BillingFeeTypeEnum feeType = getByCode(code);
        return feeType != null ? feeType.getDescription() : null;
    }
    
    /**
     * 判断是否为物业费
     * 
     * @param code 枚举值
     * @return true-物业费，false-其他
     */
    public static boolean isProperty(String code) {
        return PROPERTY.getCode().equals(code);
    }
    
    /**
     * 判断是否为卫生费
     * 
     * @param code 枚举值
     * @return true-卫生费，false-其他
     */
    public static boolean isSanitation(String code) {
        return SANITATION.getCode().equals(code);
    }
    
    /**
     * 判断是否为燃气费
     * 
     * @param code 枚举值
     * @return true-燃气费，false-其他
     */
    public static boolean isGas(String code) {
        return GAS.getCode().equals(code);
    }
    
    /**
     * 判断是否为水费
     * 
     * @param code 枚举值
     * @return true-水费，false-其他
     */
    public static boolean isWater(String code) {
        return WATER.getCode().equals(code);
    }
    
    /**
     * 判断是否为电费
     * 
     * @param code 枚举值
     * @return true-电费，false-其他
     */
    public static boolean isElectricity(String code) {
        return ELECTRICITY.getCode().equals(code);
    }
    
    /**
     * 获取所有费用类型代码
     * 
     * @return 费用类型代码数组
     */
    public static String[] getAllCodes() {
        BillingFeeTypeEnum[] values = values();
        String[] codes = new String[values.length];
        for (int i = 0; i < values.length; i++) {
            codes[i] = values[i].getCode();
        }
        return codes;
    }
    
    /**
     * 获取所有费用类型描述
     * 
     * @return 费用类型描述数组
     */
    public static String[] getAllDescriptions() {
        BillingFeeTypeEnum[] values = values();
        String[] descriptions = new String[values.length];
        for (int i = 0; i < values.length; i++) {
            descriptions[i] = values[i].getDescription();
        }
        return descriptions;
    }
}
